第10回 成長会計
マクロ経済学で最もよく用いられる生産関数は、コブ・ダグラス型生産関数 Y = F(K,L) = A K^{\alpha} L^{1-\alpha}
推計するには:
Y = A K^{\alpha} L^{1-\alpha} について、両辺の対数をとると、 \log Y = \log A + \alpha \log K + (1-\alpha) \log L
これまで使ってきた回帰モデルと比較すると Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2
エクササイズ: Penn World Tableのデータテーブルから、
を取得して、分析する。
rgdpna: 実質GDP(支出側、現地通貨単位)
emp: 被雇用者数(百万人)
avh: 平均労働時間
rnna: 資本ストック(百万円、現地通貨単位)
| year | rgdpna | emp | avh | rnna | |
|---|---|---|---|---|---|
| 6090 | 1950 | 272826.00000 | 39.407654 | 2030.413757 | 790520.8125 |
| 6091 | 1951 | 297234.68750 | 40.384689 | 2012.990686 | 833484.4375 |
| 6092 | 1952 | 333982.59375 | 41.342064 | 1995.717124 | 865191.6875 |
| 6093 | 1953 | 356372.46875 | 42.261971 | 1978.591787 | 893951.9375 |
| 6094 | 1954 | 374102.46875 | 42.801991 | 2008.945400 | 929572.2500 |
| year | rgdpna | emp | avh | rnna | Linput | |
|---|---|---|---|---|---|---|
| 6090 | 1950 | 272826.00000 | 39.407654 | 2030.413757 | 790520.8125 | 80013.842415 |
| 6091 | 1951 | 297234.68750 | 40.384689 | 2012.990686 | 833484.4375 | 81294.003497 |
| 6092 | 1952 | 333982.59375 | 41.342064 | 1995.717124 | 865191.6875 | 82507.064882 |
| 6093 | 1953 | 356372.46875 | 42.261971 | 1978.591787 | 893951.9375 | 83619.187780 |
| 6094 | 1954 | 374102.46875 | 42.801991 | 2008.945400 | 929572.2500 | 85986.861942 |
# 値の抽出
y = df_tab["rgdpna"].values # GDPをyとする
x = df_tab.loc[:,["rnna","Linput"]].values # 資本ストック、労働投入量の順で、その値のみ取り出してxとする
# y,xの全て値について対数を取る
lny = np.log(y) # yの対数がlny
lnx = np.log(x) # xの対数がlnx
lnX = sm.add_constant(lnx) # lnxに定数項を足す
# 説明変数(X)の中身をチェック
print("----------")
print("xのチェック")
print(lnX[:5])
print("----------")
result = sm.OLS(lny,lnX).fit(cov_type="HC0") # 回帰分析の実行
print(result.summary()) #サマリの表示----------
xのチェック
[[ 1. 13.58044726 11.28995493]
[ 1. 13.63337031 11.30582754]
[ 1. 13.67070637 11.3206392 ]
[ 1. 13.70340729 11.33402829]
[ 1. 13.74247981 11.3619498 ]]
----------
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.997
Model: OLS Adj. R-squared: 0.997
Method: Least Squares F-statistic: 1.059e+04
Date: Fri, 12 Sep 2025 Prob (F-statistic): 1.60e-84
Time: 20:52:46 Log-Likelihood: 111.23
No. Observations: 70 AIC: -216.5
Df Residuals: 67 BIC: -209.7
Df Model: 2
Covariance Type: HC0
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -7.9731 1.170 -6.815 0.000 -10.266 -5.680
x1 0.6826 0.010 69.747 0.000 0.663 0.702
x2 1.0055 0.111 9.029 0.000 0.787 1.224
==============================================================================
Omnibus: 1.375 Durbin-Watson: 0.119
Prob(Omnibus): 0.503 Jarque-Bera (JB): 1.133
Skew: -0.088 Prob(JB): 0.567
Kurtosis: 2.402 Cond. No. 3.01e+03
==============================================================================
Notes:
[1] Standard Errors are heteroscedasticity robust (HC0)
[2] The condition number is large, 3.01e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
\log Y = \log A + \beta_1 \log K + \beta_2 \log L の推計によって出てきた係数を入れると、 \log Y = -7.97 + 0.68 \log K + 1.00 \log L となっていることがわかる。
\log A = -7.97なので、 A = e^{-7.97}
Aの値: 0.0003446107864493169
もとの生産関数が Y = A K^{\beta_1} L^{\beta_2} であったと考えれば、推計された係数を用いると、 A = \frac{Y}{K^{\beta_1} L^{\beta_2}} = \frac{Y}{K^{0.68}L^{1.00}} と計算できそう。
Y、K、Lについては各年の値がわかっているので、これらをもとに、各年のTFPが算出できる(はず)。
import matplotlib.pyplot as plt
year = df_tab["year"].values
Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量
year
beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数
A = Y/(K**beta1 * L**beta2)
plt.plot(year,A)
plt.title("TFP")
plt.show()実は、コブ・ダグラス生産関数を仮定するならば、次の関係が成立する。 \alpha = \frac{rK}{Y} 1-\alpha = \frac{wL}{Y}
rK/Y: 資本分配率
wL/Y: 労働分配率
import matplotlib.pyplot as plt
year = df_tab["year"].values
Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量
beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数
alpha = 1/3 # 経験的なalpha値
A0 = Y/(K**beta1 * L**beta2) # 回帰でのTFP
A1 = Y/(K**alpha * L**(1-alpha)) # 経験的なalphaでのTFP
## プロット
plt.plot(year,A0, label="reg")
plt.plot(year,A1, label="use_labor_comp")
plt.title("TFP")
plt.legend()
plt.show()import matplotlib.pyplot as plt
year = df_tab["year"].values
Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量
beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数
alpha = 1/3 # 経験的なalpha値
A0 = Y/(K**beta1 * L**beta2) # 回帰でのTFP
A1 = Y/(K**alpha * L**(1-alpha)) # 経験的なalphaでのTFP
## プロット
## A0[-3], A1[-3]がそれぞれ2017年のTFP
plt.plot(year,A0/A0[-3], label="reg")
plt.plot(year,A1/A1[-3], label="use_labor_comp")
plt.title("TFP")
plt.legend()
plt.show()import matplotlib.pyplot as plt
year = df_tab["year"].values
Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量
beta1 = result.params[1] # lnKの係数
beta2 = result.params[2] # lnLの係数
alpha = 1/3 # 経験的なalpha値
A0 = Y/(K**beta1 * L**beta2) # 回帰でのTFP
A1 = Y/(K**alpha * L**(1-alpha)) # 経験的なalphaでのTFP
## プロット
## 変化率 = x[t]/x[t-1] - 1 で算出
plt.plot(year[1:],A0[1:]/A0[:-1]-1, label="reg")
plt.plot(year[1:],A1[1:]/A1[:-1]-1, label="use_labor_comp")
plt.title("TFP")
plt.legend()
plt.show()df = pd.read_excel("./pwt1001.xlsx", sheet_name="Data") # PWTデータの読み込み
df_jp = df[df["country"] == "Japan"] # 日本のデータの抽出
year = df_jp["year"].values
A_pwt = df_jp["rtfpna"].values # TFPの値が入っているのが"rtfpna"の列
plt.plot(year,A0/A0[-3], label="reg")
plt.plot(year,A1/A1[-3], label="use_labor_comp")
plt.plot(year, A_pwt, label="PWT")
plt.title("TFP (y2017=1)")
plt.legend()
plt.show()いくつかの期間が成長率ベースでTFPを測っているのは、ソロー残差の概念に基づいている。 GDPの成長率について、次のように分解ができるとされている。 \frac{\Delta Y}{Y} = \frac{\Delta A}{A} + \alpha \frac{\Delta K}{K} + (1-\alpha) \frac{\Delta L}{L} 整理すると、 \frac{\Delta A}{A} = \frac{\Delta Y}{Y} - \alpha \frac{\Delta K}{K} - (1-\alpha) \frac{\Delta L}{L} つまり、TFPの成長率がGDP、資本ストック、労働投入量の成長率および労働分配率から残差として計算できる、ということ。
Y = A K^{\alpha} L^{1-\alpha} を仮定すると、y\equiv Y/L、k \equiv K/Lとして、 y = A k^{\alpha} とできる。 両辺の対数を取って、 \log y = \log A + \alpha \log k となる。 このモデルでの推計は、暗に規模に関して収穫一定であることを課していると解釈できる。
year = df_tab["year"].values
Y = df_tab["rgdpna"].values # GDP
K = df_tab["rnna"].values # 資本ストック
L = df_tab["Linput"].values # 労働投入量
# 一人当たりに変換
y = Y/L
k = K/L
df_tab["k"] = k
x = df_tab.loc[:,["k","Linput"]].values
X = sm.add_constant(x)
result = sm.OLS(y,X).fit(cov_type="HC0")
print(result.summary()) OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.997
Model: OLS Adj. R-squared: 0.997
Method: Least Squares F-statistic: 1.332e+04
Date: Fri, 12 Sep 2025 Prob (F-statistic): 7.53e-88
Time: 20:52:49 Log-Likelihood: -74.615
No. Observations: 70 AIC: 155.2
Df Residuals: 67 BIC: 162.0
Df Model: 2
Covariance Type: HC0
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -8.8124 0.705 -12.493 0.000 -10.195 -7.430
x1 0.1746 0.002 100.033 0.000 0.171 0.178
x2 0.0001 6.92e-06 18.361 0.000 0.000 0.000
==============================================================================
Omnibus: 1.454 Durbin-Watson: 0.277
Prob(Omnibus): 0.483 Jarque-Bera (JB): 1.263
Skew: 0.160 Prob(JB): 0.532
Kurtosis: 2.425 Cond. No. 1.18e+06
==============================================================================
Notes:
[1] Standard Errors are heteroscedasticity robust (HC0)
[2] The condition number is large, 1.18e+06. This might indicate that there are
strong multicollinearity or other numerical problems.
t = \frac{\hat{\alpha} - \alpha}{\hat{SE}(\hat{\alpha})} \sim \mathcal{N}(0,1) であった。 左右に2.5%ずつ(閾値は1.96)の面積を取って除いてやれば、残りの区間の値が出る確率は95%。 -1.96 \le \frac{\hat{\alpha} - \alpha}{\hat{SE}(\hat{\alpha})} \le 1.96 なので、 \hat{\alpha} - 1.96\hat{SE}(\hat{\alpha}) \le \alpha \le \hat{\alpha} + 1.96\hat{SE}(\hat{\alpha}) このような推定を区間推定という。
先の推計値を入れてみよう。 0.1882 - 1.96\times 0.003 \le \alpha \le 0.1882 + 1.96\times 0.003 0.1832 \le \alpha \le 0.1932 資本分配率がだいたいこのくらい。 労働分配率は 1- 0.1932 \le 1-\alpha \le 1 - 0.1832 0.8068 \le 1-\alpha \le 0.8168 なので、1/3よりは大きそう。
第10回 成長会計